從 Day1 到 Day18,我們已經學會了變數、資料型態、判斷式、迴圈,
還一路走過了四大集合型態 (List、Tuple、Set、Dict)。
到這邊,你可能已經發現一件事:
「我的程式越寫越長,重複的程式碼也越來越多!」
比方說:
這樣一來程式就會變得冗長、難維護,也不方便之後修改。
這時候,Python 就幫我們準備了一個
「把程式碼收納起來、想用再叫出來」的魔法盒子—— 函式 (function) ✨
簡單一句話:
函式就是「把程式打包起來,取一個名字,想用就呼叫它」的東西。
有點像家裡的「電鍋」:
這邊要特別注意一下:
def 後方通常會放上函式名稱 ( 名稱不能和變數名稱重複 )、輸入參數的小括號,
後方再加上一個冒號,函式的程式採用「縮排」的方式表現 !
語法長這樣:
def 函式名稱(參數):
# 程式內容
return 回傳值
def
:代表「定義函式」函式名稱
:自己取的名字(要有意義,像是 bmi
、add
、greet
)參數
:函式需要的輸入(像是身高、體重、姓名)return
:函式的輸出結果(可以有,也可以沒有)注意幾個重點:
a()
、test1()
,建議用小寫與底線,例如 calculate_area()
。範例:
def say_hello():
print("哈囉,我是 Python!第17屆IThome鐵人賽,沒在獨自升級的一起來~")
say_hello() # 呼叫函式
輸出:
用函式的好處就是:不用再寫 print,直接呼叫 say_hello() 就行。
函式可以接收「外部傳入的資料」,讓同一個函式可以處理不同情況,而不是只能寫死。
def greet(name):
print(f"嗨,{name}!歡迎學 Python~")
greet("Sharon")
greet("John")
name
是函式的「參數」,呼叫時傳入的 "Sharon"
、"John"
是「實際值」。
輸出:
如果呼叫時沒有傳值,可以用預設值。
def greet(name="Stranger"):
print("Hello,", name)
greet() # 使用預設值
greet("Sharon") # 覆蓋預設值
輸出:
很適合「可有可無」的情境,例如預設地區、預設分數。
直接指定參數名稱,不需要照順序。
def greet(name, age):
print(f"{name} 已經 {age} 歲了")
greet(age=20, name="小華") # 參數順序顛倒也沒問題
注意:
greet(age=20, "小華") # ❌ 語法錯誤
def greet(name, age):
print(name, age)
greet("小明") # ❌ 缺少參數
輸出:
def introduce(name, city):
print(f"{name} 來自 {city}")
introduce("台北", "小美") # ❌ 順序反了
如果怕順序錯誤的話,可以利用關鍵字參數:
introduce(city="台北", name="小美")
輸出:
函式除了執行動作,也可以回傳一個結果,讓我們在外部使用。
函式通常會「輸入資料 → 計算 → 傳回結果」。
沒有return,函式預設回傳None。
def square(x):
return x * x
print("平方:", square(5))
輸出:
def add(a, b):
return a + b
result = add(3, 5)
print("加總結果:", result)
輸出:
⚠️ 新手常見錯誤:
print()
就等於回傳值 (錯誤想法)正確作法:
def add(a, b):
return a + b
在 Python 裡,如果你定義了兩個同名函式,後面會覆蓋掉前面的。
def greet():
print("哈囉")
def greet(name):
print("哈囉", name)
greet("小明")
輸出:
建議:命名要清楚有意義,避免同名。
有時候我們不知道使用者會傳幾個參數,這時候就可以用:
*args
:接收「不定數量的位置參數」*kwargs
:接收「不定數量的關鍵字參數」*args
:接收多個位置參數, 將多個位置參數打包成一個 tuple。def add_all(*numbers):
total = 0
for n in numbers:
total += n
return total
print("1+2+3 =",add_all(1, 2, 3)) # 6
print("10+20+30+5 =",add_all(10, 20, 30, 5)) # 65
輸出:
2.*kwargs
:接收多個「鍵=值」參數,將多個關鍵字參數打包成一個 dictionary。
範例1:
def show_info(**person):
for key, value in person.items():
print(f"{key}: {value}")
show_info(name="小美", age=20, city="台北")
輸出:
範例2:
def personInfo(name, age, **other):
print("==== info ====")
print("name:", name)
print("age:", age)
for key in other:
print(key, ":", other[key])
personInfo("Sharon", 40)
personInfo("David", 35, phone="0987654321", company="TSMC")
personInfo("Amy", 28, email="amy@gmail.com", company="Google", gender="Female")
輸出:
Python 規則:
位置參數 → 預設參數 → *args → 關鍵字參數 → **kwargs
def test(a, b=10, *args, c, **kwargs):
print(a, b, args, c, kwargs)
test(1, 2, 3, 4, c=5, x=100, y=200)
輸出:
範例1:不定長度參數 *args
(點餐系統)
menu = {"漢堡": 50, "薯條": 30, "可樂": 20, "炸雞": 70}
def calc_order(*items):
total = sum(menu[item] for item in items if item in menu)
return total
print("=== 菜單 ===")
for food, price in menu.items():
print(f"{food}:{price} 元")
order = []
while True:
choice = input("請輸入餐點(輸入 q 結束):")
if choice == "q":
break
if choice not in menu:
print("⚠️ 沒有這道餐點")
continue
order.append(choice)
print("您的餐點:", order)
print("總金額:", calc_order(*order))
輸出:
範例2:BMI 計算器
def calculate_bmi(weight, height):
bmi = weight / (height ** 2)
return bmi
def bmi_category(bmi):
if bmi < 18.5:
return "過輕"
elif bmi < 24:
return "正常"
elif bmi < 27:
return "過重"
else:
return "肥胖"
weight = float(input("請輸入體重(kg):"))
height = float(input("請輸入身高(m):"))
bmi = calculate_bmi(weight, height)
print("你的 BMI 值:", round(bmi, 2), "類別:", bmi_category(bmi))
輸出:
辛苦啦!謝謝大家願意看我幾乎每篇都ㄌㄡˋㄌㄡˋㄉㄥˊ的文章!
不過在撰寫文章的同時,我自己也在進步當中~!
每篇文章的字字句句都是經過我內化過後加上我大學的學習經驗所整理出來的!!
不過我也有可能會有寫錯的時候~也歡迎糾正及討論呦~
今天我們學會了函式的基本概念:
*args
和 *kwargs
函式的好處應該很明顯了吧——程式變短、重複程式碼少、維護更方便!
明天我們會進入 進階函式的世界,學習更多實用技巧!
有空的話,可以先多練習今天教的範例和語法重點,這樣明天上手會更快喔~
那麼,我們明天見啦!✨